0

次のコードを使用します。

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

私が得る正確なエラーは次のとおりです。

{"指定された型メンバー 'Computed' は、LINQ to Entities ではサポートされていません。初期化子、エンティティ メンバー、およびエンティティ ナビゲーション プロパティのみがサポートされています。"}

4

3 に答える 3

2

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

編集済み:フィールドがたくさんある場合は、オートマッパーを使用できます

ここに例があります。たとえば、DB からクラス User を取得し、クラス UserModel を取得して、フィールド Name と Surname から構成されるフィールド FullName を追加したとします。したがって、オブジェクト 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; }
    }
于 2013-04-04T08:06:51.763 に答える
1

これを解決しましたか?

既存のモデルに追加したいのが 1 つまたは 2 つの追加情報だけの場合、ViewModel を使用するのは好きではありません。

私がよく行うのは、モデルにマップされていないフィールドを作成し、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

OK、これは別のループを意味しますが、少なくとも 1 つの DB 呼び出しだけです。

別のオプションは、すべてを T-SQL で実行し、T-SQL を直接 (またはストアド プロシージャ経由で) 発行することです。

このリンクはその方法を説明しています - 追加のボーナスとして、この方法はより複雑なクエリではるかに高速ですが、私にとっては常にちょっとしたハックのように感じます.

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

于 2013-06-10T11:19:48.497 に答える
0

最初にデータをリストに入れることでこれを達成しました。これはおそらくひどいことですが (特に大量の結果がある場合)、うまく機能し、理解しやすいものです。

リスト全体を処理するループがあります。他のソリューションでこれが必要かどうかはわかりませんが、現在それらを理解するのに苦労しているため、DropDownList にデータを入力するという、私がやろうとしていたことに対して機能するものが必要です。

繰り返しますが、このソリューションが理想的だとは本当に思いません。

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
    }
}
于 2013-10-25T14:07:34.523 に答える