3

匿名タイプを返すクエリを実行すると

    var assets =
        from Product p in Session.CreateLinq<Product>()
        where bundles.Contains(p.ProductBundle)
        select new {p.Asset, p.Asset.PropertyTbl};

var以外にreturnを入力できますか?

4

7 に答える 7

6

呼び出し元はそれがどのタイプであるかを知らず、それを使用できないため、匿名タイプを返すことはできません*。

結果を返したい場合は、匿名でないタイプのオブジェクトを作成できます。

IEnumerable<Foo> assets =
    from Product p in Session.CreateLinq<Product>()
    where bundles.Contains(p.ProductBundle)
    select new Foo { Bar = p.Asset, Baz = p.Asset.PropertyTbl};

値のカスタムクラスを作成したくない場合は、.NET4でタプル型を使用することもできます。


*これは厳密には真実ではありません-可能ですが、それを避ける必要があります。あなたが本当にしたいのであれば、とにかくここにリンクがあります。

于 2010-07-27T08:39:36.280 に答える
4

object代わりにまたはdynamic(.NET 4.0では)を使用できますがvar、匿名型の名前を見つけることは期待できません。あなたの場合var、少なくとも現在のメソッドのスコープを離れるまで強い型付けを保持するので、使用する方が良いです。

于 2010-07-27T08:38:31.287 に答える
1

新しいクラスを定義できます。

public class AssetProp
{
   public virtual string Asset {get;set;}
   public virtual string PropertyTbl {get;set;}
}

そして、それをそのクラスとして返すことができます。

IEnumerable<AssetProp> assets =
    from Product p in Session.CreateLinq<Product>()
    where bundles.Contains(p.ProductBundle)
    select new AssetProp {p.Asset, p.Asset.PropertyTbl};
于 2010-07-27T08:40:40.713 に答える
0

これを行うこともできます(「var」を別の場所に移動するだけなので、問題に大きく関係しますが、これらのタイプが同じものとして認識されるのは興味深いことです)

        var element = new { id = 7 };

        List<object> collection = new List<object>();
        element = collection.Select(item => new { id = 0 }).First();
于 2010-07-27T09:17:17.660 に答える
0

ラムダ式を使用する場合は可能ですが、そうでない場合はキャストを実行できますが、いくつかの適切な例外処理を実行できます。

于 2010-07-27T08:47:20.890 に答える
0

あまり。オブジェクトにキャストすると、匿名クラスのプロパティにアクセスできなくなります。

varキーワードは、匿名クラスを処理するために特別に導入されました-なぜそれを避けたいのですか?データを返す必要がある場合は、クラスに名前を付ける必要があります。

于 2010-07-27T08:39:52.737 に答える
0

new {p.Asset, p.Asset.PropertyTbl}コードが匿名型を作成するため、実際にはそうではありません。後で有用なものにキャストすることはできないため、使用してもobjectあまりメリットはありません。そのため、プロパティにアクセスするにはリフレクションを使用する必要があります。

于 2010-07-27T08:42:21.323 に答える