Может ли этот запрос Linq быть напечатан как-нибудь иначе, чем "var"? - PullRequest
3 голосов
/ 27 июля 2010

Когда я делаю запрос, который возвращает анонимный тип

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

Могу ли я напечатать возврат чего-либо, кроме var?

Ответы [ 7 ]

6 голосов
/ 27 июля 2010

Вы не можете * вернуть анонимный тип, потому что вызывающая сторона не будет знать, какой это тип, и не сможет его использовать.

Если вы хотите вернуть результаты, вы можете создать объектынеанонимный тип:

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

Вы также можете использовать тип Tuple в .NET 4, если не хотите создавать пользовательский класс для своих значений.


* Это не совсем верно - это возможно, но вам следует избегать этого.Вот ссылка в любом случае, если вы действительно хотите.

4 голосов
/ 27 июля 2010

Вы можете использовать object или dynamic (в .NET 4.0) вместо var, но не ожидайте найти имя для анонимного типа.В вашем случае лучше использовать var, поскольку оно сохранит строгую типизацию по крайней мере до тех пор, пока вы не покинете область действия текущего метода.

1 голос
/ 27 июля 2010

Вы можете определить новый класс:

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};
0 голосов
/ 27 июля 2010

вы также можете сделать это (хотя это сильно относится к вашей проблеме, потому что вы просто перемещаете «var» в другое место, но интересно, что он распознает эти типы как одинаковые)

        var element = new { id = 7 };

        List<object> collection = new List<object>();
        element = collection.Select(item => new { id = 0 }).First();
0 голосов
/ 27 июля 2010

Вы можете использовать, если вы используете лямбда-выражения , в противном случае вы можете выполнить приведение, но выполните хорошую обработку исключений.

0 голосов
/ 27 июля 2010

Не совсем, так как код new {p.Asset, p.Asset.PropertyTbl} создает анонимный тип.Даже использование object на самом деле не приносит вам большой пользы, так как вы не сможете применить его к чему-либо полезному позже, поэтому вам придется использовать отражение для доступа к свойствам.

0 голосов
/ 27 июля 2010

Не совсем.Если вы приведете объект к объекту, вы не сможете получить доступ к свойствам вашего анонимного класса.

Ключевое слово var было специально введено для работы с анонимными классами - почему вы хотите этого избежать?Если вам нужно вернуть данные, вы должны назвать класс.

...