Linq to Entities,Master Detail into DataContracts Query

时间:2013-09-22 23:40:33

标签: c# linq entity-framework asp.net-web-api datacontract

这是我的WebAPI的一部分,我无法将Linq中的数据从实体中导入到我的Datacontract对象中。我将向调用者返回一个自定义数据类型,无论他们想要XML还是JSON,我都不在乎,我只是把它交给WebAPI来处理它。

我在C#中使用VS2013和EF5,ASP.NET 4.5

结构如下:

产品分类

ID
CategoryName
(a million other things)
List<Products>

产品

ID
ProductName
(a million other things)
Category

我已经设置了一个如下所示的DataContract:

ProductCategoryDataContract

ProductCategoryId
ProductCategoryName
List<ProductDataContract> Products

ProductDataContract

ProductName

基本上,我希望获得Linq查询以返回所有类别,并在其中返回所有产品。

from prodcat in context.ProductCategories order by prodcat.ItemOrder
select new ProductCategoryDataContract
{
ProductCategoryId = prodcat.Id
Products = prodcat.Products // this obviously fails as ProductDataContract != Products
}

如果我尝试

Products = new List<ProductDataContract> { //initializer stuff }

我没有任何我认为会有的智能感知(ProductName等),因为我猜我在列表中。

基本上,我已经建立了所有的关系,我可以直接获得EF,但是因为我将这些放入新的数据交换中,它给了我一点悲伤(主要是因为我缺乏linq知识)。

我的问题是: 1.)我该怎么做

和 2.)如何以最小的数据库命中执行此操作。我可能会在数十个产品组中解雇数千件物品。

非常感谢,如果我不清楚任何事情,请lmk。并且,以上是伪造的,不是真正的交易所以如果我做了愚蠢的命名错误,那不太可能'它':)

1 个答案:

答案 0 :(得分:1)

public interface IProducts
{
    int ProductId { get; set; }
    decimal Price { get; set; }
    List<IProductCategories> Categorieses { get; set; }
}

public interface IProductCategories
{
    int ProductId { get; set; }
    string ProductCategoryName { get; set; }
}

internal class Products : IProducts
{
    public int ProductId { get; set; }
    public decimal Price { get; set; }
    public List<IProductCategories> Categorieses { get; set; }
}

internal class ProductCategories : IProductCategories
{
    public int ProductId { get; set; }
    public string ProductCategoryName { get; set; }

    public ProductCategories(int productId, string productCategoryName)
    {
        ProductId = productId;
        ProductCategoryName = productCategoryName;
    }
}

public class ProductDataContract
{
    public int ProductId { get; set; }
    public List<IProductCategories> Categorieses { get; set; }
}

//以下是获取数据的方式:

        // your retun objects
        var products = new List<ProductDataContract>();

        using (
            var db =
                new DataClassesDataContext(
                    ConfigurationManager.ConnectionStrings["TestConnectionString"].ConnectionString))
        {

            foreach (var prod in db.Products.Select(p => new Products {ProductId = p.ProductId}))
            {
                prod.Categorieses = new List<IProductCategories>();

                foreach (var category in db.ProductCategories.Where(c => c.ProductId == prod.ProductId))
                {
                    prod.Categorieses.Add(new ProductCategories(category.ProductId, category.ProductCategoryName));
                }

                products.Add(new ProductDataContract {Categorieses = prod.Categorieses, ProductId = prod.ProductId});
            }
        }