簡體   English   中英

使用LINQ的EF中的計算列

[英]Computed Columns in EF using LINQ

用下面的代碼;

  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'。僅支持初始化程序,實體成員和實體導航屬性。”}

您可以創建類,其中擁有所需的所有字段:id,foo,bar等,並將其添加到Calculated字段中,然后只需修改查詢即可:

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   
                };

編輯:如果您有很多字段,可以使用自動映射器

這是一個例子。 假設您從數據庫中獲得了User類,並獲得了UserModel類,在其中添加了一個FullName字段,該字段由Name和Surname字段組成。 因此,您想從對象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;}
}

然后在我的Linq查詢中

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

好的,這意味着另一個循環,但至少只有一個數據庫調用。

另一個選擇是在T-SQL中完成所有操作,然后直接發布T-SQL(或通過存儲的proc)

此鏈接說明了-作為一種額外的好處,這種方法在進行更復雜的查詢時速度更快,但對我來說總是有點不合時宜。

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

我首先將數據放入列表中來完成此任務。 這可能很糟糕(特別是如果您獲得大量結果),但是它確實有效並且易於理解。

整個列表涉及一個循環。 我不確定其他解決方案是否需要此解決方案,但是我目前也很難理解它們,因此我需要一些可以滿足我所要執行的工作的方法,即填充DropDownList。

同樣,我真的不認為此解決方案是理想的:

假設我有一個帶有表Registration的實體YourEntities

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
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM