使用LINQ计算EF中的列

本文关键字:EF LINQ 计算 使用 | 更新日期: 2023-09-27 18:07:17

使用以下代码;

  using (var context = new FINSAT613Entities())
        {
            gridControl1.ForceInitialize();

            DateTime endtime= new DateTime(2013, 03, 29, 15, 49, 54);
            Text = "endtime:"+endtime.ToShortDateString();

            var query =
                from A in context.A
                join B in context.B on A.ID equals B.ID
                join C in context.C on A.ID2 equals C.ID2
                where A.endtime> endtime && A.Chk.StartsWith("320")
                select new
                       {
                         A.ID,B.FOO,C.BAR etc...
                       };

            BindingSource.DataSource = query;
            gridControl1.DataSource = BindingSource;
        }

如何添加计算列到它?(例如,将a.bar与b.foo相乘)

尝试使用局部类,但没有成功。

    public partial class A
{
    public decimal Calculated
    {
        get { return 15; }
    }
}
我得到的确切错误是:

{"在LINQ to Entities中不支持指定的类型成员'Computed'。只支持初始化器、实体成员和实体导航属性。"}

使用LINQ计算EF中的列

你可以创建一个类,它有你需要的所有字段:id, foo, bar等,并添加到它的计算字段,然后只需修改你的查询:

var query =
                from A in context.A
                join B in context.B on A.ID equals B.ID
                join C in context.C on A.ID2 equals C.ID2
                where A.endtime> endtime && A.Chk.StartsWith("320")
                select new YourNewClass
                {
                    Foo = A.foo,
                    Bar = B.bar,
                    ... ,
                    Calculated = A.foo * B.bar   
                };

编辑:如果你有很多字段,你可以使用automapper

下面是一个例子。比如说,你已经从DB中获得了类User,并且你已经获得了类UserModel,其中你添加了一个字段FullName,该字段由字段Name和姓氏组成。因此,您希望从对象User创建对象UserModel,但不要专门复制所有字段。你可以这样做:

class Program
    {
        static void Main(string[] args)
        {
            User u = new User { Name = "My", Surname = "Name" };
            Mapper.CreateMap<User, UserModel>().ForMember(dest => dest.FullName, o => o.MapFrom(src => string.Format("{0} {1}", src.Name, src.Surname)));
            UserModel um = Mapper.Map<User, UserModel>(u);
            Console.WriteLine(um.FullName);
        }
    }
    public class User
    {
        public string Name { get; set; }
        public string Surname { get; set; }
    }
    public class UserModel
    {
        public string Name { get; set; }
        public string Surname { get; set; }
        public string FullName { get; set; }
    }

你解决了吗?

我一直在寻找一个更整洁的方式,我不喜欢使用ViewModels,当我想添加到一个现有的模型只是一个或两个额外的信息。

我倾向于做的是在我的模型中创建一个非映射字段,从LINQ获得我需要的所有信息到临时模型,然后在我将其发送回客户端之前在另一个循环中执行任何所需的重新映射。

例如;

public partial class A
{
[NotMapped]
public decimal Calculated {get;set;}
}

then in my Linq Query

var query =
            from A in context.A
            join B in context.B on A.ID equals B.ID
            join C in context.C on A.ID2 equals C.ID2
            where A.endtime> endtime && A.Chk.StartsWith("320")
            select new
                   {
                     A = A,
                     B = B,
                     C = C
                   };
foreach(item i in query)
    {
        A.Calculated = A.Foo * B.Bar;
    }
return query

好吧,这意味着另一个循环,但至少它只是一个DB调用。

另一种选择是在T-SQL中完成所有操作,并直接(或通过存储过程)发出T-SQL

这个链接解释了——作为一个额外的好处,这种方法在处理更复杂的查询时要快得多,但对我来说,它总是感觉有点像一个hack。

http://weblogs.asp.net/scottgu/archive/2007/08/16/linq-to-sql-part-6-retrieving-data-using-stored-procedures.aspx

首先将数据放入List中。这可能很糟糕(特别是如果你有大量的结果),但它确实有效,而且很容易理解。

有一个遍历整个列表的循环。我不确定其他解决方案是否需要这个,但我目前也很难理解它们,所以我需要一些东西,为我想做的工作,这是填充一个下拉列表。

我真的不认为这个解决方案是理想的:

假设我有一个实体YourEntities和一个表Registration

using (var context = new YourEntities()) 
{
    var query = from x in context.Registrations
                select x; //Just an example, selecting everything.
    List<Registration> MyList = query.ToList();
    foreach (Registration reg in MyList) //Can also be "var reg in MyList"
    {
        MyDropDownList.Items.Add(new ListItem(reg.LastName + ", " + reg.FirstName, reg.ID));
        //Or do whatever you want to each List Item
    }
}