Так как CustomFunction является ScalarFunction в базе данных, LINQ to SQL должен быть в состоянии эффективно ее оценить.Возможно, вы захотите использовать LET, чтобы получить значение один раз, но проверьте сгенерированный SQL и план выполнения запроса, чтобы увидеть, предлагает ли он какие-либо улучшения или же SQL Server автоматически выполняет соответствующие оптимизации внутри.
var list = (from p in Products
join cat in Product_SubCategory_Mapping
on p.UserId equals cat.UserId
join sub in SubCategories
on cat.SubCategoryId equals sub.SubCategoryId
let trend = CustomFunction(p.ID)
where sub.CategoryId == 19 && trend > 100
select new { p, p.Vendor, trend })
.Skip((pageNum - 1) * pageSize)
.Take(pageSize);
ЕслиЕсть ассоциации между вашими элементами, вы можете использовать их, а не объединения.Это не меняет сгенерированный запрос (в значительной степени), но может быть немного более удобен в обслуживании, поскольку объединения абстрагируются ассоциациями, установленными в модели.
var list = (from p in Products
from cat in p.Product_SubCategory_Mappings
let trend = CustomFunction(p.ID)
where cat.SubCategory.CategoryId == 19 && trend > 100
select new { Product = p, p.Vendor, trend})
.Skip(pageNum - 1) * pageSize)
.Take(pageSize);