0

这是我的 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:

产品类别数据合同

ProductCategoryId
ProductCategoryName
List<ProductDataContract> Products

产品数据合同

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。而且,上面是伪代码,不是真正的交易,所以如果我犯了愚蠢的命名错误,那不太可能是“它”:)

4

1 回答 1

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});
            }
        }
于 2013-09-23T01:20:37.307 回答